﻿// Колесов 
using System;
using ComLaoBase;

namespace Transfer
{
    /// <summary> Варианты расчета налога
    /// </summary>
    public enum TaxCalcMode
    {
        /// <summary> Налог рассчитывается извлечением из общей суммы
        /// </summary>
        Extract,
        /// <summary> Налог рассчитывается добавлением к сумме
        /// </summary>
        Add,
        /// <summary> Без НДС
        /// </summary>
        Absent
    }
    
    /// <summary> Класс содержит описание параметров налоговой модели.
    /// При создании объекта загружаются настройки модели.
    /// </summary>
    public class LaoTax
    {
        /// <summary> Шифр налоговой модели задается в настройках программы
        /// </summary>
        public string TaxModelCode
        {
            get { return _taxModelCode; }
            set { _taxModelCode = value; }
        }
        private string _taxModelCode = string.Empty;

        /// <summary> Rcd налоговой модели
        /// </summary>
        public Int32 TaxModelRcd
        {
            get { return _taxModelRcd; }
            set { _taxModelRcd = value; }
        }
        private Int32 _taxModelRcd = 0;

        /// <summary> Вариант расчета налогов
        /// </summary>
        public TaxCalcMode TaxClcMode
        {
            get { return _taxClcMode; }
            set { _taxClcMode = value; }
        }
        private TaxCalcMode _taxClcMode = TaxCalcMode.Absent;

        /// <summary> Rcd налога (НДС)
        /// </summary>
        public int TaxRcd
        {
            get { return _taxRcd; }
            set { _taxRcd = value; }
        }
        private int _taxRcd = 0;
	
        /// <summary> Величина ставки налога
        /// </summary>
        public int TaxRateValue
        {
            get { return _taxRateValue; }
            set { _taxRateValue = value; }
        }
        private int _taxRateValue = 0;

        /// <summary> Название налога. Определяем для контроля.
        /// </summary>
        public string TaxName
        {
            get { return _taxName; }
            set { _taxName = value; }
        }
        private string _taxName = "Без НДС";
	
        /// <summary> При создании объекта по указанному шифру определяются параметры
        /// налоговой модели. Предполагаем, что в налоговой модели присутствует описание
        /// только одного налога - НДС, либо их нет вообще.
        /// </summary>
        /// <param name="taxcode"></param>
        public LaoTax(string taxcode)
        {
            TaxModelCode = taxcode.Trim();

            LAOBase _tax = LAO_DB.Open("TTrdMdlObj", "Index_2");
            if (_tax.Find(1, taxcode.Trim(), 0, 0, 0, 0, 0, 0, 0, 0, 0))
                TaxModelRcd = _tax.GetInteger("Rcd");
            else
            {
                _tax.Close();
                return;     // Ошибка - налоговая модель не найдена
            }

            // Перечень налогов в модели
            LAOBase _mdl = _tax.GetSubObject("TMdlTaxObj");
            TaxClcMode = TaxCalcMode.Absent;
            _mdl.First();
            if (!_mdl.IsEOO())
            {
                if (_mdl.GetInteger("Alg") == 1)
                    TaxClcMode = TaxCalcMode.Extract;
                TaxRcd = _mdl.GetInteger("TaxID");
                // Читаем название налога
                LAOBase _taxObj = LAO_DB.Open("TTaxObj", "Index_1");
                if (_taxObj.Find(1, TaxRcd, 0, 0, 0, 0, 0, 0, 0, 0, 0))
                    TaxName = _taxObj.GetString("Nm", "");
                _taxObj.Close();
                
                Int32 rateRcd = _mdl.GetInteger("Rate");
                if (rateRcd != 0)  // Ставка налога указана в модели
                {
                    // Читаем параметры ставки налога
                    LAOBase _rate = LAO_DB.Open("TTaxRateObj", "Index_2");
                    if (_rate.Find(1, rateRcd, 0, 0, 0, 0, 0, 0, 0, 0, 0))
                        TaxRateValue = _rate.GetInteger("Val");
                    _rate.Close();
                }

            }
            
            _mdl.Close();
            _tax.Close();

        }

        /// <summary> Вывод всей информации о налоговой модели в виде строки
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            return String.Format("Параметры налоговой модели:  Шифр: {0}; Rcd: {1}; Ставка: {2}%; Способ: {3}; Налог: {4}; Rcd: {5}",
                                 TaxModelCode, TaxModelRcd, TaxRateValue, TaxClcMode, TaxName, TaxRcd);
        }
    }
}
